\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{defpattern}[1994/10/12]

\message{%
  `\string\defpattern-macro (adapted from \string\howto\space (Alan Jeffrey in TeX and TUG NEWS 2(2)))'%
}

%define a macro \defpattern for defining ML-like pattern matching macros
%adapted from the \howto-macro from tugboat

\def\xcs#1#2{\expandafter#1\csname#2\endcsname}
\newcount\actioncount
\def\defpattern#1[#2]#3{%
  \xcs\ifx{\expandafter\gobble\string#1}\relax
  \def#1{\erroraction#1}\fi
  \advance\actioncount by 1\relax
  \expandafter\defaction\expandafter{#1}{#3}{#2}%
  \def\temp##1##2##3##4##5##6##7##8##9{\def\temp{[#2]}}%
  \temp\empty\empty\empty\empty\empty\empty\empty\empty\empty
  \edef#1{\noexpand\doaction\xcs\noexpand
    {action-\the\actioncount}\temp}}
\def\defaction#1#2#3{%
  \xcs\def{action-\the\actioncount}##1[#3]{\applyto{#1}{#2}}}
\def\gobble#1{}
\def\applyto#1#2#3{#3{#1}{#2}}
\def\doaction#1[#2][#3]{#1[#3]\success[#2]\failure[#3]}
\def\success#1#2[#3]\failure[#4]{#2}
\def\failure#1#2{#1}
\def\erroraction#1[#2]{%
   \errmessage{I don't know how to \string#1[#2]}}

